package edu.cmu.cs.stage3.alice.authoringtool.util;

import javax.swing.JTree;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeExpansionListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.tree.TreePath;

public class TreeTableModelAdapter extends AbstractTableModel implements TypedTableModel {
	JTree tree;
	TreeTableModel treeTableModel;

	public TreeTableModelAdapter( TreeTableModel treeTableModel, JTree tree ) {
		this.tree = tree;
		this.treeTableModel = treeTableModel;

		tree.addTreeExpansionListener(
				new TreeExpansionListener() {
					// Don't use fireTableRowsInserted() here;
					// the selection model would get  updated twice.
					public void treeExpanded(TreeExpansionEvent event) {
						TreeTableModelAdapter.this.fireTableDataChanged();
					}
					public void treeCollapsed(TreeExpansionEvent event) {
						TreeTableModelAdapter.this.fireTableDataChanged();
					}
				}
		);
	}

	// Wrappers, implementing TableModel interface.

	public int getColumnCount() {
		return treeTableModel.getColumnCount();
	}

	//Rem @Override
	public String getColumnName(int column) {
		return treeTableModel.getColumnName( column );
	}

	//Rem @Override
	public Class getColumnClass(int column) {
		return treeTableModel.getColumnClass( column );
	}

	public int getRowCount() {
		return tree.getRowCount();
	}

	public Object nodeForRow( int row ) {
		TreePath treePath = tree.getPathForRow( row );
		return treePath.getLastPathComponent();
	}

	public Object getValueAt( int row, int column ) {
		return treeTableModel.getValueAt( nodeForRow(row), column );
	}

	public Class getTypeAt( int row, int column ) {
		return treeTableModel.getTypeAt( nodeForRow(row), column );
	}

	public boolean isNullValidAt( int row, int column ) {
		return treeTableModel.isNullValidAt( nodeForRow( row ), column );
	}

	//Rem @Override
	public boolean isCellEditable( int row, int column ) {
		return treeTableModel.isCellEditable( nodeForRow(row), column );
	}

	//Rem @Override
	public void setValueAt( Object value, int row, int column ) {
		treeTableModel.setValueAt( value, nodeForRow(row), column );
	}
}

